package com.titaniue.java;

import org.junit.Test;

import java.io.*;

/**
 *@program: JavaSenior
 *@description:
 *
 * 对象流的使用
 *
 * 1.ObjectInputStream 和 ObjectOutputStream
 * 2.作用： 用于存储和读取基本数据类型数据对象的处理流。他的强大之处在于可以
 * 把Java中的对象写入到数据源中，也能把对象从数据源中还原回来
 *
 * 3.想要一个java对象时可序列化的，需要满足相对于的要求，见Person.java类
 *
 * 4.序列化机制:
 * 允许把内存中的Java对象转换成平台无关的二进制流，从
 * 而允许把这种二进制流持久地保存在磁盘上，或通过网络将这种二进制流传 输到另一个网络节点。
 * //当其它程序获取了这种二进制流，就可以恢复成原 来的Java对象
 *
 *@author: renfei.huang
 *@create: 2021-10-18 10:21
 */
public class javaObjectInputStreamOutputStreamTest {


    /*
     *
     * 写入对象
     * 序列化过程： 将内存中的java对象保存到磁盘中或通过网络传输出去
     * 使用ObjectOutputStream实现
     *
     *
     * */

    @Test
    public void test1() {
        ObjectOutputStream objectOutputStream = null;

        try {
            //1.
            objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.txt"));

            //2.
            objectOutputStream.writeObject(new String("测试测试了额"));

            objectOutputStream.writeObject(new Person("马云",44));
            objectOutputStream.writeObject(new Person("李嘉诚",55,new Account(1000.0)));

            //刷新操作
            objectOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (objectOutputStream != null) {
                //关闭资源
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }

    }


    /*
    *
    * 读取对象
    * 反序列化： 将磁盘文件中的对象还原为内存中的一个java对象
    * 使用OjbectInputStream来实现
    *
    * */
    @Test
    public  void  test2() throws IOException, ClassNotFoundException {

        ObjectInputStream objectInputStream = null;
        try {
            objectInputStream = new ObjectInputStream(new FileInputStream("object.txt"));

            Object object =objectInputStream.readObject();
            String str =(String) object;

            Person person = (Person)objectInputStream.readObject();

            Person person2 = (Person)objectInputStream.readObject();


            System.out.println(str);
            System.out.println(person);
            System.out.println(person2);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (objectInputStream != null) {
                try {
                    objectInputStream.close();
                } finally {

                }
            }
        }
    }

}
